package com.dys.testio02;

import java.io.*;

/**
 * @className: src.main.java.com.dys.testio02.FileReaderAndFileWriter
 * @description: src.main.java.com.dys.testio02
 * @author: pine cone
 * @version: v1.0.0
 * @createTime: 2024/08/14 下午10:39
 */
public class FileReaderAndFileWriter {
    /**
     * 这是一个main()方法,是应用程序的入口
     *
     * @param args 方法的形参列表,是一个字符串数组,包含了从命令行传递给程序的参数
     */
    public static void main(String[] args) throws IOException {
        new FileReaderAndFileWriter().testWriteTryCatchFinally();
    }

    /**
     * 一个字符一个字符的复制
     *
     * @throws IOException
     */
    public void testReadAndWrite() throws IOException {
        // 1.有一个源文件
        File f1 = new File("E:\\demo.txt");
        // 2.有一个目标文件
        File f2 = new File("E:\\test.txt");
        // 3.搞一根管怼到源文件
        FileReader fr = new FileReader(f1);
        // 4.搞一根管怼到目标文件
        FileWriter fw = new FileWriter(f2);
        // 5.开始动作
        // 方式1：一个字符一个字符的复制
        int n = fr.read();
        while (n != -1) {
            fw.write(n);
            n = fr.read();
        }
        // 6.关流，倒着关
        fw.close();
        fr.close();
    }

    /**
     * 利用缓冲字符数组进行写出
     *
     * @throws IOException
     */
    public void testWriteAndRead() throws IOException {
        File f1 = new File("E:\\demo.txt");
        File f2 = new File("E:\\test.txt");
        FileReader fr = new FileReader(f1);
        FileWriter fw = new FileWriter(f2);
        char[] ch = new char[5];
        int len = fr.read(ch);
        while (len != -1) {
            // 将缓冲数组中的有效长度写出
            fw.write(ch, 0, len);
            len = fr.read(ch);
        }
        fw.close();
        fr.close();
    }

    /**
     * 利用缓冲字符数组，将数组转为String写出
     *
     * @throws IOException
     */
    public void testBuffArrayWriteAndRead() throws IOException {
        File f1 = new File("E:\\demo.txt");
        File f2 = new File("E:\\test.txt");
        FileReader fr = new FileReader(f1);
        FileWriter fw = new FileWriter(f2);
        char[] ch = new char[5];
        int len = fr.read(ch);
        while (len != -1) {
            String s = new String(ch, 0, len);
            // 将缓冲数组中的有效长度写出
            fw.write(s);
            len = fr.read(ch);
        }
        fw.close();
        fr.close();
    }

    /**
     * 使用try-catch-finally处理异常
     */
    public void testWriteTryCatchFinally() {
        File f1 = new File("E:\\demo.txt");
        File f2 = new File("E:\\test.txt");
        FileReader fr = null;
        FileWriter fw = null;
        try {
            fr = new FileReader(f1);
            fw = new FileWriter(f2);
            char[] ch = new char[5];
            int len = fr.read(ch);
            while (len != -1) {
                String s = new String(ch, 0, len);
                // 将缓冲数组中的有效长度写出
                fw.write(s);
                len = fr.read(ch);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fw != null) {
                    fw.close();
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            try {
                if (fr != null) {
                    fr.close();
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}
